// 联合类型
// 定义两个类型
// 类型1
interface Userone {
  isSchool: boolean
  sayHello: () => {}
}
// 类型2
interface UserTwo {
  isSchool: boolean
  sayBey: () => {}
}
// 定义一个 user 方法，它可能是类型1 也可能是类型2，那么它就是一个联合类型
function user(animal: Userone | UserTwo) {
  // 在联合类型里就可能需要进行类型守护
  // 类型守护方式1：断言-as
  // 根据 user 可能是不同的类型从而调用不同的方法
  if (animal.isSchool) {
    ;(animal as UserTwo).sayBey()
  } else {
    ;(animal as Userone).sayHello()
  }
}
// 类型守护方式2：in
function user2(animal: Userone | UserTwo) {
  if ('sayHello' in animal) {
    animal.sayHello()
  } else {
    animal.sayBey()
  }
}

// 类型守护方式3：typeof-具备不同的数据类型的场景下可使用
function add(start: string | number, end: string | number) {
  if (typeof start === 'string' || typeof end === 'string') {
    return `${start}${end}`
  } else {
    return start + end
  }
}
// 类型守护方式4：instanceof-判断类型是否是某一个已知类型
class NumberObj {
  count: number = 0
}
// 定义一个方法 addObj 它的两个参数都有可能是任意一个对象类型，也可能是 NumberObj 类型（NumberObj 类型是已知的）
function addObj(start: object | NumberObj, end: object | NumberObj) {
  if (start instanceof NumberObj && end instanceof NumberObj) {
    return start.count + end.count
  } else {
    return 0
  }
}
